package com.uniflow.config;

import org.flowable.spring.SpringProcessEngineConfiguration;
import org.flowable.spring.boot.EngineConfigurationConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/**
 * Flowable工作流引擎的核心配置。
 * <p>
 * 这个配置类确保Flowable引擎在初始化时，
 * 能够明确地使用由Spring管理的、与MyBatis-Plus共享的同一个DataSource和TransactionManager。
 * 这可以防止在多个持久化框架共存时可能发生的初始化冲突。
 * <p>
 * 注意：flowable-spring-boot-starter会自动创建RuntimeService, RepositoryService等Bean。
 */
@Configuration
public class FlowableConfig {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private PlatformTransactionManager transactionManager;

    /**
     * 通过实现 EngineConfigurationConfigurer 接口来定制 Flowable 引擎配置。
     * 确保使用Spring管理的数据源和事务管理器。
     */
    @Bean
    public EngineConfigurationConfigurer<SpringProcessEngineConfiguration> customFlowableEngineConfigurer() {
        return engineConfiguration -> {
            // 明确设置数据源和事务管理器
            engineConfiguration.setDataSource(dataSource);
            engineConfiguration.setTransactionManager(transactionManager);
            
            // 数据库配置
            engineConfiguration.setDatabaseSchemaUpdate("true");
            engineConfiguration.setDatabaseType("mysql");
            
            // 字体配置
            engineConfiguration.setActivityFontName("宋体");
            engineConfiguration.setLabelFontName("宋体");
            engineConfiguration.setAnnotationFontName("宋体");
            
            // 异步执行器配置
            engineConfiguration.setAsyncExecutorActivate(true);
            engineConfiguration.setAsyncExecutorCorePoolSize(2);
            engineConfiguration.setAsyncExecutorMaxPoolSize(10);
            
            // 历史记录配置
            engineConfiguration.setDbHistoryUsed(true);
            
            // 启用安全XML解析
            engineConfiguration.setEnableSafeBpmnXml(true);
        };
    }
}